//package com.smartStatus.gateway.filter;
//
//import cn.hutool.core.util.StrUtil;
//import com.fasterxml.jackson.core.JsonProcessingException;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.smartStatus.core.api.VerficationCode;
//import com.smartStatus.core.constant.SecurityConstant;
//import com.smartStatus.core.util.R;
//import lombok.AllArgsConstructor;
//import lombok.SneakyThrows;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.cloud.gateway.filter.GatewayFilter;
//import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.data.redis.serializer.StringRedisSerializer;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.MediaType;
//import org.springframework.http.server.reactive.ServerHttpRequest;
//import org.springframework.http.server.reactive.ServerHttpResponse;
//import org.springframework.stereotype.Component;
//import reactor.core.publisher.Mono;
//
///**
// * @ClassName : CodeCheckFilter
// * @Author : lby
// * @Date: 2021/5/24 15:31
// * @Description : 验证码校验*/
//
//
//@Slf4j
//@Component
//@AllArgsConstructor
//public class CodeCheckFilter extends AbstractGatewayFilterFactory {
//    private final RedisTemplate redisTemplate;
//    private final ObjectMapper objectMapper;
//
//    @Override
//    public GatewayFilter apply(Object config) {
//        return (exchange, chain) -> {
//            ServerHttpRequest request = exchange.getRequest();
//
//            // 不是登录请求，直接向下执行
//            if (!StrUtil.containsAnyIgnoreCase(request.getURI().getPath()
//                    , SecurityConstant.OAUTH_TOKEN_URL, SecurityConstant.SMS_TOKEN_URL
//                    , SecurityConstant.SOCIAL_TOKEN_URL)) {
//                return chain.filter(exchange);
//            }
//
//            // 刷新token，直接向下执行
//            String grantType = request.getQueryParams().getFirst("grant_type");
//            if (StrUtil.equals(SecurityConstant.REFRESH_TOKEN, grantType)) {
//                return chain.filter(exchange);
//            }
//
//            try {
//                //校验验证码
//                checkCode(request);
//            } catch (Exception e) {
//                ServerHttpResponse response = exchange.getResponse();
//                response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
//                response.setStatusCode(HttpStatus.PRECONDITION_REQUIRED);
//                try {
//                    return response.writeWith(Mono.just(response.bufferFactory()
//                            .wrap(objectMapper.writeValueAsBytes(
//                                    R.failed(e.getMessage())))));
//                } catch (JsonProcessingException e1) {
//                    log.error("对象输出异常", e1);
//                }
//            }
//
//            return chain.filter(exchange);
//        };
//    }
//
//
///**
//     * 检查验证码
//     *
//     * @param request*/
//
//
//
//    @SneakyThrows
//    private void checkCode(ServerHttpRequest request) {
//
//        String code = request.getQueryParams().getFirst("code");
//
//        if (StrUtil.isBlank(code)) {
//            throw new Exception("验证码不能为空");
//        }
//        String key = VerficationCode.CODE_PREFIX;
//        redisTemplate.setKeySerializer(new StringRedisSerializer());
//
//        if (!redisTemplate.hasKey(key)) {
//            throw new Exception("验证码不合法");
//        }
//
//        Object codeObj = redisTemplate.opsForValue().get(key);
//
//        if (codeObj == null) {
//            throw new Exception("验证码不合法");
//        }
//
//        String saveCode = codeObj.toString();
//        if (StrUtil.isBlank(saveCode)) {
//            redisTemplate.delete(key);
//            throw new Exception("验证码不合法");
//        }
//
//        if (!StrUtil.equals(saveCode, code)) {
//            redisTemplate.delete(key);
//            throw new Exception("验证码不合法");
//        }
//
//        redisTemplate.delete(key);
//    }
//}
